#coding: utf-8
from ..instance import *
from ..manager import *
from ..utils import get_default_manager


def overwrite_default_helper(default_kwargs, kwargs):
    for key in default_kwargs:
        if key not in kwargs:
            kwargs[key] = default_kwargs[key]


def get_default_name_kwargs(manager, name):
    return {'name': manager.get_no_duplicated_name(name)}


def as_op(basic_name='process'):
    '''
    as_op实际上不是修饰器，而是输入一系列参数，输出的是一个修饰器
    使用方法
    @as_op()
    def f(df, df, n=9):
        pass
    '''
    def as_op_wrapper(func):
        '''
        as_op_wrapper是真正的修饰器。严格输入一个函数，输出一个函数
        '''
        def func_new(*args, **kwargs):
            '''
            被包装的函数最后按这样的顺序执行。
            原始函数不能含有name、save_in_memory、save_in_file、load_from_file这种参数，不然会造成冲突。
            修饰之后可以自由地采用这四个参数
            '''
            raw_func = kwargs.get('raw_func', None)
            if 'raw_func' in kwargs:
                del kwargs['raw_func']
            if raw_func is True:
                return func(*args, **kwargs)

            name = kwargs.get('name', None)
            if 'name' in kwargs:
                del kwargs['name']

            default_manager = get_default_manager()
            if name is None:
                name = default_manager.get_no_duplicated_name(basic_name)

            def func_helper(manager, sess, *args, **kwargs):
                return func(*args, **kwargs)

            return Instance(func_helper, args, kwargs, name=name, manager=default_manager)

        return func_new

    return as_op_wrapper
